home *** CD-ROM | disk | FTP | other *** search
/ Computer Inter@ctive 16 / Computer Interactive cdrom 16 - dic 98.iso / zdnetit / content / CLASSBLD.ZIP / Include / CB_IteratorStaticMulti.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-10-08  |  8.6 KB  |  298 lines

  1. #ifndef CB_ITERATOR_STATIC_MULTI_H
  2. #define CB_ITERATOR_STATIC_MULTI_H
  3.  
  4. #ifdef _AFXEXT
  5. #define CB_EXT_CLASS       AFX_CLASS_EXPORT
  6. #else
  7. #define CB_EXT_CLASS
  8. #endif
  9.  
  10.  
  11. #define ITERATOR_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  12.     class CB_EXT_CLASS NameTo##Iterator\
  13.     {\
  14.     private:\
  15.         ClassTo* _ref##NameTo;\
  16.         ClassTo* _prev##NameTo;\
  17.         ClassTo* _next##NameTo;\
  18.         \
  19.         NameTo##Iterator* _prev;\
  20.         NameTo##Iterator* _next;\
  21.         \
  22.         int (ClassTo::*_method)();\
  23.         \
  24.         static NameTo##Iterator* _first;\
  25.         static NameTo##Iterator* _last;\
  26.         \
  27.     public:\
  28.         NameTo##Iterator(int (ClassTo::*method)() = 0,\
  29.                          ClassTo* ref##NameTo = (ClassTo*)0);\
  30.         NameTo##Iterator(const NameTo##Iterator& iterator,\
  31.                          int (ClassTo::*method)() = 0);\
  32.         ~NameTo##Iterator();\
  33.         \
  34.         NameTo##Iterator& operator= (const NameTo##Iterator& iterator)\
  35.         {\
  36.             _ref##NameTo = iterator._ref##NameTo;\
  37.             _prev##NameTo = iterator._prev##NameTo;\
  38.             _next##NameTo = iterator._next##NameTo;\
  39.             _method = iterator._method;\
  40.             return *this;\
  41.         }\
  42.         ClassTo* operator++ ()\
  43.         {\
  44.             _next##NameTo = GetNext##NameTo(_next##NameTo);\
  45.             if (_method != 0)\
  46.             {\
  47.                 while (_next##NameTo && !(_next##NameTo->*_method)())\
  48.                     _next##NameTo = GetNext##NameTo(_next##NameTo);\
  49.             }\
  50.             _ref##NameTo = _prev##NameTo = _next##NameTo;\
  51.             return _ref##NameTo;\
  52.         }\
  53.         ClassTo* operator-- ()\
  54.         {\
  55.             _prev##NameTo = GetPrev##NameTo(_prev##NameTo);\
  56.             if (_method != 0)\
  57.             {\
  58.                 while (_prev##NameTo && !(_prev##NameTo->*_method)())\
  59.                     _prev##NameTo = GetPrev##NameTo(_prev##NameTo);\
  60.             }\
  61.             _ref##NameTo = _next##NameTo = _prev##NameTo;\
  62.             return _ref##NameTo;\
  63.         }\
  64.         operator ClassTo*() { return _ref##NameTo; }\
  65.         ClassTo* operator-> () { return _ref##NameTo; }\
  66.         void Reset() { _ref##NameTo = _prev##NameTo = _next##NameTo = (ClassTo*)0; }\
  67.         \
  68.         int IsLast() { return (GetLast##NameTo() == _ref##NameTo); }\
  69.         int IsFirst() { return (GetFirst##NameTo() == _ref##NameTo); }\
  70.         \
  71.         static void Check(ClassTo* item##NameTo);\
  72.         static void Check(ClassTo* item##NameTo, ClassTo* newItem##NameTo);\
  73.     }; 
  74.  
  75. #define METHODS_ITERATOR_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  76.     ClassFrom##::##NameTo##Iterator* ClassFrom##::##NameTo##Iterator::_first = 0;\
  77.     ClassFrom##::##NameTo##Iterator* ClassFrom##::##NameTo##Iterator::_last = 0;\
  78.     ClassFrom##::##NameTo##Iterator::NameTo##Iterator(int (ClassTo::*method)(), ClassTo* ref##NameTo)\
  79.     {\
  80.         _ref##NameTo = _prev##NameTo = _next##NameTo = ref##NameTo;\
  81.         _prev = (NameTo##Iterator*)0;\
  82.         _next = (NameTo##Iterator*)0;\
  83.         _method = method;\
  84.         if (_last)\
  85.         {\
  86.             _last->_next = this;\
  87.             _prev = _last;\
  88.             _last = this;\
  89.         }\
  90.         else\
  91.             _first = _last = this;\
  92.     }\
  93.     \
  94.     ClassFrom##::##NameTo##Iterator::NameTo##Iterator(const NameTo##Iterator& iterator, int (ClassTo::*method)())\
  95.     {\
  96.         _ref##NameTo = iterator._ref##NameTo;\
  97.         _prev##NameTo = iterator._prev##NameTo;\
  98.         _next##NameTo = iterator._next##NameTo;\
  99.         _prev = (NameTo##Iterator*)0;\
  100.         _next = (NameTo##Iterator*)0;\
  101.         _method = method;\
  102.         if (_last)\
  103.         {\
  104.             _last->_next = this;\
  105.             _prev = _last;\
  106.             _last = this;\
  107.         }\
  108.         else\
  109.             _first = _last = this;\
  110.     }\
  111.     \
  112.     ClassFrom##::##NameTo##Iterator::~NameTo##Iterator()\
  113.     {\
  114.         if (_next)\
  115.             _next->_prev = _prev;\
  116.         else\
  117.             _last = _prev;\
  118.     \
  119.         if (_prev)\
  120.             _prev->_next = _next;\
  121.         else\
  122.             _first = _next;\
  123.     }\
  124.     \
  125.     void ClassFrom##::##NameTo##Iterator::Check(ClassTo* item##NameTo)\
  126.     {\
  127.         for (NameTo##Iterator* item = _first; item; item = item->_next)\
  128.         {\
  129.             if (item->_prev##NameTo == item##NameTo)\
  130.             {\
  131.                 item->_prev##NameTo = GetNext##NameTo(item->_prev##NameTo);\
  132.                 item->_ref##NameTo = 0;\
  133.             }\
  134.             if (item->_next##NameTo == item##NameTo)\
  135.             {\
  136.                 item->_next##NameTo = GetPrev##NameTo(item->_next##NameTo);\
  137.                 item->_ref##NameTo = 0;\
  138.             }\
  139.         }\
  140.     }\
  141.     \
  142.     void ClassFrom##::##NameTo##Iterator::Check(ClassTo* item##NameTo, ClassTo* newItem##NameTo)\
  143.     {\
  144.         for (NameTo##Iterator* item = _first; item; item = item->_next)\
  145.         {\
  146.             if (item->_ref##NameTo == item##NameTo)\
  147.             {\
  148.                 item->_ref##NameTo = item->_prev##NameTo = item->_next##NameTo = newItem##NameTo;\
  149.             }\
  150.             if (item->_prev##NameTo == item##NameTo)\
  151.             {\
  152.                 item->_prev##NameTo = newItem##NameTo;\
  153.                 item->_ref##NameTo = 0;\
  154.             }\
  155.             if (item->_next##NameTo == item##NameTo)\
  156.             {\
  157.                 item->_next##NameTo = newItem##NameTo;\
  158.                 item->_ref##NameTo = 0;\
  159.             }\
  160.         }\
  161.     }
  162.  
  163. #define ITERATOR_NOFILTER_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  164.     class CB_EXT_CLASS NameTo##Iterator\
  165.     {\
  166.     private:\
  167.         ClassTo* _ref##NameTo;\
  168.         ClassTo* _prev##NameTo;\
  169.         ClassTo* _next##NameTo;\
  170.         \
  171.         NameTo##Iterator* _prev;\
  172.         NameTo##Iterator* _next;\
  173.         \
  174.         static NameTo##Iterator* _first;\
  175.         static NameTo##Iterator* _last;\
  176.         \
  177.     public:\
  178.         NameTo##Iterator(ClassTo* ref##NameTo = (ClassTo*)0);\
  179.         NameTo##Iterator(const NameTo##Iterator& iterator);\
  180.         ~NameTo##Iterator();\
  181.         \
  182.         NameTo##Iterator& operator= (const NameTo##Iterator& iterator)\
  183.         {\
  184.             _ref##NameTo = iterator._ref##NameTo;\
  185.             _prev##NameTo = iterator._prev##NameTo;\
  186.             _next##NameTo = iterator._next##NameTo;\
  187.             return *this;\
  188.         }\
  189.         ClassTo* operator++ ()\
  190.         {\
  191.             _next##NameTo = GetNext##NameTo(_next##NameTo);\
  192.             _ref##NameTo = _prev##NameTo = _next##NameTo;\
  193.             return _ref##NameTo;\
  194.         }\
  195.         ClassTo* operator-- ()\
  196.         {\
  197.             _prev##NameTo = GetPrev##NameTo(_prev##NameTo);\
  198.             _ref##NameTo = _next##NameTo = _prev##NameTo;\
  199.             return _ref##NameTo;\
  200.         }\
  201.         operator ClassTo*() { return _ref##NameTo; }\
  202.         ClassTo* operator-> () { return _ref##NameTo; }\
  203.         void Reset() { _ref##NameTo = _prev##NameTo = _next##NameTo = (ClassTo*)0; }\
  204.         \
  205.         int IsLast() { return (GetLast##NameTo() == _ref##NameTo); }\
  206.         int IsFirst() { return (GetFirst##NameTo() == _ref##NameTo); }\
  207.         \
  208.         static void Check(ClassTo* item##NameTo);\
  209.         static void Check(ClassTo* item##NameTo, ClassTo* newItem##NameTo);\
  210.     }; 
  211.  
  212. #define METHODS_ITERATOR_NOFILTER_STATIC_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  213.     ClassFrom##::##NameTo##Iterator* ClassFrom##::##NameTo##Iterator::_first = 0;\
  214.     ClassFrom##::##NameTo##Iterator* ClassFrom##::##NameTo##Iterator::_last = 0;\
  215.     ClassFrom##::##NameTo##Iterator::NameTo##Iterator(ClassTo* ref##NameTo)\
  216.     {\
  217.         _ref##NameTo = _prev##NameTo = _next##NameTo = ref##NameTo;\
  218.         _prev = (NameTo##Iterator*)0;\
  219.         _next = (NameTo##Iterator*)0;\
  220.         if (_last)\
  221.         {\
  222.             _last->_next = this;\
  223.             _prev = _last;\
  224.             _last = this;\
  225.         }\
  226.         else\
  227.             _first = _last = this;\
  228.     }\
  229.     \
  230.     ClassFrom##::##NameTo##Iterator::NameTo##Iterator(const NameTo##Iterator& iterator)\
  231.     {\
  232.         _ref##NameTo = iterator._ref##NameTo;\
  233.         _prev##NameTo = iterator._prev##NameTo;\
  234.         _next##NameTo = iterator._next##NameTo;\
  235.         _prev = (NameTo##Iterator*)0;\
  236.         _next = (NameTo##Iterator*)0;\
  237.         if (_last)\
  238.         {\
  239.             _last->_next = this;\
  240.             _prev = _last;\
  241.             _last = this;\
  242.         }\
  243.         else\
  244.             _first = _last = this;\
  245.     }\
  246.     \
  247.     ClassFrom##::##NameTo##Iterator::~NameTo##Iterator()\
  248.     {\
  249.         if (_next)\
  250.             _next->_prev = _prev;\
  251.         else\
  252.             _last = _prev;\
  253.         \
  254.         if (_prev)\
  255.             _prev->_next = _next;\
  256.         else\
  257.             _first = _next;\
  258.     }\
  259.     \
  260.     void ClassFrom##::##NameTo##Iterator::Check(ClassTo* item##NameTo)\
  261.     {\
  262.         for (NameTo##Iterator* item = _first; item; item = item->_next)\
  263.         {\
  264.             if (item->_prev##NameTo == item##NameTo)\
  265.             {\
  266.                 item->_prev##NameTo = GetNext##NameTo(item->_prev##NameTo);\
  267.                 item->_ref##NameTo = 0;\
  268.             }\
  269.             if (item->_next##NameTo == item##NameTo)\
  270.             {\
  271.                 item->_next##NameTo = GetPrev##NameTo(item->_next##NameTo);\
  272.                 item->_ref##NameTo = 0;\
  273.             }\
  274.         }\
  275.     }\
  276.     \
  277.     void ClassFrom##::##NameTo##Iterator::Check(ClassTo* item##NameTo, ClassTo* newItem##NameTo)\
  278.     {\
  279.         for (NameTo##Iterator* item = _first; item; item = item->_next)\
  280.         {\
  281.             if (item->_ref##NameTo == item##NameTo)\
  282.             {\
  283.                 item->_ref##NameTo = item->_prev##NameTo = item->_next##NameTo = newItem##NameTo;\
  284.             }\
  285.             if (item->_prev##NameTo == item##NameTo)\
  286.             {\
  287.                 item->_prev##NameTo = newItem##NameTo;\
  288.                 item->_ref##NameTo = 0;\
  289.             }\
  290.             if (item->_next##NameTo == item##NameTo)\
  291.             {\
  292.                 item->_next##NameTo = newItem##NameTo;\
  293.                 item->_ref##NameTo = 0;\
  294.             }\
  295.         }\
  296.     }
  297.  
  298. #endif